#include "Image.h"

using namespace WONAPI;

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
Image::~Image()
{
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void Image::DrawEntire(DisplayContext *theContext, int x, int y)
{
	Draw(theContext, x, y, 0, 0, mWidth, mHeight);
}


///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void Image::Draw(DisplayContext *theContext, int x, int y, int left, int top, int width, int height)
{
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
NativeImagePtr Image::GetNative(DisplayContext *theContext)
{
	NativeImagePtr anImage = theContext->CreateImage(mWidth,mHeight);
	anImage->GetGraphics().DrawImage(this,0,0);
	return anImage;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
ImagePiece::ImagePiece(Image *theImage, int left, int top, int width, int height) : mImage(theImage)
{
	mLeft = left;
	mTop = top;
	mWidth = width;
	mHeight = height;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
ImagePiece::~ImagePiece()
{
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void ImagePiece::Draw(DisplayContext *theContext, int x, int y, int left, int top, int width, int height)
{
	mImage->Draw(theContext,x,y,left+mLeft,top+mTop,width,height);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
ProgramImage::ProgramImage(PaintFunc thePaintFunc)
{
	mWidth = mHeight = 0;
	mPaintFunc = thePaintFunc;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
ProgramImage::ProgramImage(int theWidth, int theHeight, PaintFunc thePaintFunc)
{
	mWidth = theWidth;
	mHeight = theHeight;
	mPaintFunc = thePaintFunc;
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void ProgramImage::Paint(Graphics &g)
{
	if(mPaintFunc!=NULL)
		mPaintFunc(g,mWidth,mHeight);
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void ProgramImage::Draw(DisplayContext *theContext, int x, int y, int left, int top, int width, int height)
{
	Graphics *g = theContext->mGraphics;
	if(g==NULL)
		return;

	int tx = g->GetTransX();
	int ty = g->GetTransY();
	g->Translate(x-tx,y-ty);

	bool clipped = false;
	if(left!=0 || top!=0 || width!=mWidth || height!=mHeight)
	{
		clipped = true;
		g->PushClipRect(left,top,width,height);
	}

	Paint(*g);

	if(clipped)
		g->PopClipRect();

	g->Translate(tx-x,ty-y);
}	
